/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modulo4;

import Acceso.FormatUtility;
import Modelo.DAL.Personal_DAO;
import Acceso.Security;
import Modelo.PersonalDsi;
import Modelo.PerteneceGrupo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

/**
 *
 * @author Rafael
 */
public class agregarPersonaAction extends org.apache.struts.action.Action {

    /* forward name="success" path="" */
    private static final String SUCCESS = "success";
    private static final String FAILURE = "failure";

    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        String[] a = {"Administrador", "Director DSI", "Jefe Apoyo Administrativo", "Personal Administrativo"};
        if (!Security.validateSession(request, a)) {
            return mapping.findForward("errorPriv");
        }

        agregarPersonaForm formBean = (agregarPersonaForm) form;
        ActionErrors errors = new ActionErrors();

        boolean hayError = false;
        String nacionalidad = formBean.getVoe();
        String ci = formBean.getCi();
        String usbid = formBean.getUsbid();
        String nombre1 = formBean.getNombre1();
        String nombre2 = formBean.getNombre2();
        String apellido1 = formBean.getApellido1();
        String apellido2 = formBean.getApellido2();
        String sexo = formBean.getSexo();
        String edoCivil = formBean.getEdoCivil();
        String fechaNac = formBean.getFechaNac();
        String telefono = formBean.getTelefono();
        String email = formBean.getEmail();
        String profesion = formBean.getProfesion();
        String activo = formBean.getActivo();
        String sede = formBean.getSede();
        String tipoPersonal = formBean.getTipoPersonal();
        String idHorario = formBean.getIdHorario();
        String funcion = formBean.getFuncion();
        String idGrupo = formBean.getIdGrupo();
        String grupoDesde = formBean.getGrupoDesde();
        String grupoHasta = formBean.getGrupoHasta();
        String transporte = formBean.getTransporte();
        String login = formBean.getLogin();
        String password = FormatUtility.md5(ci);
        String cargo = formBean.getCargo();
        String puestoTrabajo = formBean.getPuestoTrabajo();
        String roles[] = request.getParameterValues("roles");

        Date fecha = null;
        int tlf = new Integer(0);

        // Validamos de cedula
        if (ci == null || ci.length() < 1) {
            errors.add("falta_Cedula", new ActionMessage("errors.falta_Cedula"));
            saveErrors(request, errors);
            hayError = true;
        } else if (!FormatUtility.validatePattern(ci, 2)) {
            errors.add("invalid_Cedula", new ActionMessage("errors.invalid_Cedula"));
            saveErrors(request, errors);
            hayError = true;
        } else {
            ci = nacionalidad + "-" + ci;
        }
        // Validamos el USBID
        if (usbid == null || usbid.length() < 1) {
            errors.add("falta_usbid", new ActionMessage("errors.falta_usbid"));
            saveErrors(request, errors);
            hayError = true;
        } else if (!FormatUtility.validatePattern(usbid, 1)) {
            errors.add("invalid_UsbId", new ActionMessage("errors.invalid_UsbId"));
            saveErrors(request, errors);
            hayError = true;
        }
        // validamos el primer nombre
        if (nombre1 == null || nombre1.length() < 1) {
            errors.add("falta_Nombre", new ActionMessage("errors.falta_Nombre"));
            saveErrors(request, errors);
            hayError = true;
        } else if (nombre1.length() < 2) {
            errors.add("long_Nombre", new ActionMessage("errors.long_Nombre"));
            saveErrors(request, errors);
            hayError = true;
        } else if (!FormatUtility.validatePattern(nombre1, 3)) {
            errors.add("invalid_caracter_N1", new ActionMessage("errors.invalid_caracter_N1"));
            saveErrors(request, errors);
            hayError = true;
        }
        // validamos el primer apellido
        if (apellido1 == null || apellido1.length() < 1) {
            errors.add("falta_Apellido", new ActionMessage("errors.falta_Apellido"));
            saveErrors(request, errors);
            hayError = true;
        } else if (apellido1.length() < 2) {
            errors.add("long_Apellido", new ActionMessage("errors.long_Apellido"));
            saveErrors(request, errors);
            hayError = true;
        } else if (!FormatUtility.validatePattern(apellido1, 3)) {
            errors.add("invalid_caracter_A1", new ActionMessage("errors.invalid_caracter_A1"));
            saveErrors(request, errors);
            hayError = true;
        }
        // validamos el segundo nombre
        if (!FormatUtility.validatePattern(nombre2, 3)) {
            errors.add("invalid_caracter_N2", new ActionMessage("errors.invalid_caracter_N2"));
            saveErrors(request, errors);
            hayError = true;
        }
        // validamos el segundo apellido
        if (!FormatUtility.validatePattern(apellido2, 3)) {
            errors.add("invalid_caracter_A2", new ActionMessage("errors.invalid_caracter_A2"));
            saveErrors(request, errors);
            hayError = true;
        }
        // Valido que el Telefono
        if (telefono != null && !telefono.equals("")) {
            if (!FormatUtility.validatePattern(telefono, 2)) {
                errors.add("telefono_letras", new ActionMessage("errors.telefono_letras"));
                saveErrors(request, errors);
                hayError = true;
            } else {
                tlf = Integer.parseInt(telefono.trim().replaceAll(" ", ""));
            }
        }
        //Chequeamos el email
        if (email != null && email.length() >= 1 && !FormatUtility.validatePattern(email, 4)) {
            errors.add("invalid_Email", new ActionMessage("errors.invalid_Email"));
            saveErrors(request, errors);
            hayError = true;
        }
        // Validamos que el grupo no sea nulo
        if (idGrupo == null || idGrupo.length() < 1) {
            errors.add("falta_grupoid", new ActionMessage("errors.falta_grupoid"));
            saveErrors(request, errors);
            hayError = true;
        }
        // Validamos que el login usb no sea nulo
        if (login == null || login.length() < 1) {
            errors.add("falta_login", new ActionMessage("errors.falta_login"));
            saveErrors(request, errors);
            hayError = true;
        }
        // Verificamos que ingresen la fecha
        if (fechaNac == null || fechaNac.length() < 1) {
            errors.add("faltaFecha", new ActionMessage("errors.faltaFecha"));
            saveErrors(request, errors);
            hayError = true;
        } else {
            // Debo chequear que la fecha sea menor a la fecha actual
            Calendar calendario = GregorianCalendar.getInstance();
            Date fecha2;
            SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
            String fechaAct = formatoDeFecha.format(calendario.getTime());
            try {
                fecha = formatoDeFecha.parse(fechaNac);
                fecha2 = formatoDeFecha.parse(fechaAct);
                if (!fecha.before(fecha2)) {
                    errors.add("invalid_fechaNac", new ActionMessage("errors.invalid_fechaNac"));
                    saveErrors(request, errors);
                    hayError = true;
                }
            } catch (ParseException ex) {
                hayError = true;
                fecha = calendario.getTime();
            }
        }
        // Verificamos que ingresen la fecha
        Calendar calendario = GregorianCalendar.getInstance();
        SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
        if (grupoDesde == null || grupoDesde.length() < 1) {
            grupoDesde = formatoDeFecha.format(calendario.getTime());
        }
        if (Personal_DAO.personalExiste(ci)) {
            hayError = true;
            errors.add("persona_ya_Existe", new ActionMessage("errors.persona_ya_Existe"));
            saveErrors(request, errors);
        }
        if (Personal_DAO.loginExiste(login)) {
            hayError = true;
            errors.add("login_ya_Existe", new ActionMessage("errors.login_ya_Existe"));
            saveErrors(request, errors);
        }
        if (!Personal_DAO.existeGrupo(idGrupo, sede)) {
            hayError = true;
            errors.add("grupo_no_existe", new ActionMessage("errors.grupo_no_existe"));
            saveErrors(request, errors);
        }
//        if (!Personal_DAO.existeRol(nombreRol)) {
//            hayError = true;
//            errors.add("rol_no_existe", new ActionMessage("errors.rol_no_existe"));
//            saveErrors(request, errors);
//        }
        if (Personal_DAO.usbidExiste(usbid)) {
            hayError = true;
            errors.add("UsbId_repetido", new ActionMessage("errors.UsbId_repetido"));
            saveErrors(request, errors);
        }
        if (hayError) {
            errors.add("persona_No_agregada", new ActionMessage("errors.persona_No_agregada"));
            saveErrors(request, errors);
            return mapping.findForward(FAILURE);
        }
        // Objetos Necesarios Para la Inserción
        PersonalDsi pDSI = new PersonalDsi();
        PerteneceGrupo PG = new PerteneceGrupo();

        pDSI.setCi(ci);
        pDSI.setNombre1(nombre1);
        pDSI.setNombre2(nombre2);
        pDSI.setApellido1(apellido1);
        pDSI.setApellido2(apellido2);
        pDSI.setTelefono(tlf);
        pDSI.setEmail(email);
        pDSI.setProfesion(profesion);
        pDSI.setUsbid(usbid);
        pDSI.setSexo(sexo.charAt(0));
        pDSI.setEstadoCivil(edoCivil);
        pDSI.setFechaNacimiento(fecha);
        pDSI.setActivo(activo);
        pDSI.setTipoPersonal(tipoPersonal);
        pDSI.setSede(sede);
        pDSI.setLogin(login);
        pDSI.setPassword(password);
        pDSI.setHorario(Long.parseLong(idHorario));
        pDSI.setTransporte(transporte);
        pDSI.setNombreCargo(cargo);
        pDSI.setNombrePuesto(puestoTrabajo);
        pDSI.setRoles(roles);

        PG.setCi(ci);
        PG.setIdGrupo(idGrupo);
        PG.setSede(sede);
        PG.setFuncion(funcion);
        PG.setDesde(grupoDesde);
        PG.setHasta(grupoHasta);

        if (Personal_DAO.insertarPersonal(pDSI, PG)) {
            return mapping.findForward(SUCCESS);
        } else {
            errors.add("persona_No_agregada", new ActionMessage("errors.persona_No_agregada"));
            saveErrors(request, errors);
            return mapping.findForward(FAILURE);
        }
    }
}
